{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "## 3. 采用5折交叉验证，分别用log似然损失和正确率，对Logistic回归模型的正则超参数调优。（各50分） "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('FE_pima-indians-diabetes.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
      "0   0.639947                      0.866045       -0.031990   \n",
      "1  -0.844885                     -1.205066       -0.528319   \n",
      "2   1.233880                      2.016662       -0.693761   \n",
      "3  -0.844885                     -1.073567       -0.528319   \n",
      "4  -1.141852                      0.504422       -2.679076   \n",
      "5   0.342981                     -0.185948        0.133453   \n",
      "6  -0.250952                     -1.435189       -1.851862   \n",
      "7   1.827813                     -0.218823       -0.031990   \n",
      "8  -0.547919                      2.476909       -0.197433   \n",
      "\n",
      "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
      "0                     0.670643      -0.181541  0.166619   \n",
      "1                    -0.012301      -0.181541 -0.852200   \n",
      "2                    -0.012301      -0.181541 -1.332500   \n",
      "3                    -0.695245      -0.540642 -0.633881   \n",
      "4                     0.670643       0.316566  1.549303   \n",
      "5                    -0.012301      -0.181541 -0.997745   \n",
      "6                     0.329171      -0.610145 -0.211799   \n",
      "7                    -0.012301      -0.181541  0.414047   \n",
      "8                     1.808882       4.660524 -0.284572   \n",
      "\n",
      "   Diabetes_pedigree_function       Age  Target  \n",
      "0                    0.468492  1.425995       1  \n",
      "1                   -0.365061 -0.190672       0  \n",
      "2                    0.604397 -0.105584       1  \n",
      "3                   -0.920763 -1.041549       0  \n",
      "4                    5.484909 -0.020496       1  \n",
      "5                   -0.818079 -0.275760       0  \n",
      "6                   -0.676133 -0.616111       1  \n",
      "7                   -1.020427 -0.360847       0  \n",
      "8                   -0.947944  1.681259       1  \n"
     ]
    }
   ],
   "source": [
    "print(data.head(9))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.031990</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>0.166619</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-0.852200</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.693761</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-1.332500</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.695245</td>\n",
       "      <td>-0.540642</td>\n",
       "      <td>-0.633881</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.679076</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>0.316566</td>\n",
       "      <td>1.549303</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.031990   \n",
       "1  -0.844885                     -1.205066       -0.528319   \n",
       "2   1.233880                      2.016662       -0.693761   \n",
       "3  -0.844885                     -1.073567       -0.528319   \n",
       "4  -1.141852                      0.504422       -2.679076   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.670643      -0.181541  0.166619   \n",
       "1                    -0.012301      -0.181541 -0.852200   \n",
       "2                    -0.012301      -0.181541 -1.332500   \n",
       "3                    -0.695245      -0.540642 -0.633881   \n",
       "4                     0.670643       0.316566  1.549303   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  \n",
       "0                    0.468492  1.425995  \n",
       "1                   -0.365061 -0.190672  \n",
       "2                    0.604397 -0.105584  \n",
       "3                   -0.920763 -1.041549  \n",
       "4                    5.484909 -0.020496  "
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train = data['Target']\n",
    "X_train = data.drop(['Target'],axis=1)\n",
    "X_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 稀疏矩阵\n",
    "\n",
    "from scipy.sparse import csr_matrix\n",
    "X_train = csr_matrix(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 超参数调优\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "# 需要的参数\n",
    "penaltys = ['l1', 'l2']\n",
    "Cs = [0.001,0.01,0.1,1,10,100,1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise-deprecating',\n",
       "             estimator=LogisticRegression(C=1.0, class_weight=None, dual=False,\n",
       "                                          fit_intercept=True,\n",
       "                                          intercept_scaling=1, l1_ratio=None,\n",
       "                                          max_iter=100, multi_class='warn',\n",
       "                                          n_jobs=None, penalty='l2',\n",
       "                                          random_state=None, solver='liblinear',\n",
       "                                          tol=0.0001, verbose=0,\n",
       "                                          warm_start=False),\n",
       "             iid='warn', n_jobs=-1,\n",
       "             param_grid={'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000],\n",
       "                         'penalty': ['l1', 'l2']},\n",
       "             pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
       "             scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# log似然损失\n",
    "\n",
    "lr_penalty = LogisticRegression(solver='liblinear')\n",
    "grid = GridSearchCV(lr_penalty, tuned_parameters, cv=5, scoring = 'neg_log_loss',n_jobs=-1,return_train_score=True)\n",
    "grid.fit(X_train, y_train)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-grid.best_score_: 0.4760291179300042\n",
      "grid.best_params_: {'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(\"-grid.best_score_: \"+ str(-grid.best_score_))\n",
    "print(\"grid.best_params_: \"+ str(grid.best_params_))\n",
    "\n",
    "# 误差曲线\n",
    "test_means = grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "\n",
    "train_means = grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# plot\n",
    "n_C = len(Cs)\n",
    "n_penalty = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_C, n_penalty)\n",
    "test_std = np.array(test_stds).reshape(n_C, n_penalty)\n",
    "train_scores = np.array(train_means).reshape(n_C, n_penalty)\n",
    "train_std = np.array(train_stds).reshape(n_C, n_penalty)\n",
    "x_axis = np.log10(C)\n",
    "# print(test_scores)\n",
    "# print(test_scores.shape)\n",
    "# print(test_std)\n",
    "# print(test_std.shape)\n",
    "\n",
    "for i,value in enumerate(penalty):\n",
    "    plt.errorbar(x=x_axis, y=-test_scores[:,i], yerr=test_std [:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x=x_axis, y=-train_scores[:,i], yerr=train_std [:,i] ,label = penaltys[i] +' Train')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel('log(C)')\n",
    "plt.ylabel('logLoss')\n",
    "plt.savefig('LogisticGridSearchCV_C.png' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 以负log似然函数做为优化标准，探索出的最优超参数为： C = 1, 正则方式L1。\n",
    "- 从$C=10^{-3}$开始，随着C的增大，模型在训练集、测试集上的表现逐渐优化，在C =1, 正则方式L1的时候达到最优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-grid.best_score_: -0.7747395833333334\n",
      "grid.best_params_: {'C': 0.1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "# 正确率\n",
    "\n",
    "lr_penalty = LogisticRegression(solver='liblinear')\n",
    "grid = GridSearchCV(lr_penalty, tuned_parameters, cv=5, scoring = 'accuracy',n_jobs=-1,return_train_score=True)\n",
    "grid.fit(X_train, y_train)\n",
    "print(\"-grid.best_score_: \"+ str(-grid.best_score_))\n",
    "print(\"grid.best_params_: \"+ str(grid.best_params_))\n",
    "\n",
    "# 误差曲线\n",
    "test_means = grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "\n",
    "train_means = grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# plot\n",
    "n_C = len(Cs)\n",
    "n_penalty = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_C, n_penalty)\n",
    "test_std = np.array(test_stds).reshape(n_C, n_penalty)\n",
    "train_scores = np.array(train_means).reshape(n_C, n_penalty)\n",
    "train_std = np.array(train_stds).reshape(n_C, n_penalty)\n",
    "x_axis = np.log10(C)\n",
    "\n",
    "for i,value in enumerate(penalty):\n",
    "    plt.errorbar(x=x_axis, y=-test_scores[:,i], yerr=test_std [:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x=x_axis, y=-train_scores[:,i], yerr=train_std [:,i] ,label = penaltys[i] +' Train')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel('log(C)')\n",
    "plt.ylabel('logLoss')\n",
    "plt.savefig('LogisticGridSearchCV_C_accuracy.png' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 以准确率做为优化标准，探索出的最优超参数为： C = 0.1, 正则方式L2。\n",
    "- 从$C=10^{-3}$开始，随着C的增大，模型在训练集、测试集上的表现逐渐优化，在C =0.1, 正则方式L2的时候达到最优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
